import axios from 'axios';
import Uuid from 'node-uuid';
import queryString  from 'query-string';  //转换格式包，无需下载
import createHistory from 'history/createHashHistory';
let cancelFlag = false;
let token = '';
axios.defaults.withCredentials = false;
axios.defaults.headers.common['token'] = token;
axios.create({
  baseURL:'',
  timeout: 15000,
  responseType:'json',
  transformRequest:[function(data){
    data.age = 30;  //发送之前增加的属性
    return queryString.stringify(data);  //利用对应方法转换格式
  }],
  transformResponse: [function(data){
    return data
  }],   //transformResponse` 在传递给 then/catch 前，允许修改响应数据
  validateStatus: function(status){
    return status < 400 //状态码小于400时均为成功（返回true）
    }, //validateStatus` 定义对于给定的HTTP 响应状态码是 resolve 或 reject  promise 。如果 `validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`)，promise 将被 resolve; 否则，promise 将被 rejecte
},
)
//开始请求设置，http request 拦截器 发起拦截处理
axios.interceptors.request.use(
  config => {
    console.log("config=======?",config)
    if (!config.params) {
      config.params = {
        timestamp: new Date().getTime(),
      };
    } else {
      config.params.timestamp = new Date().getTime();
    };
    if (!config.isCancelTocken) {
      let apiToken = '************';
      config.headers['auth-id'] = `${Uuid.v4()}`;
      config.headers['Cache-Control'] = 'no-cache';
      config.headers['X-Requested-With']='XMLHttpRequest';
      // config.headers['content-type']='application/x-www-form-urlencoded';
      config.headers['content-type']='application/json;charset=UTF-8';
      config.headers['Authorization'] =`Bearer ${apiToken}`;
      /*  
      * 给数据定义一个唯一标识符，便于寻找，关联。
      * uuid.v1(); -->基于时间戳生成  （time-based）2、uuid.v4(); -->随机生成  (random)
      * 通常我们使用基于时间戳  v1()  生成的UID，随机生成  v4()  还是有一定几率重复的。
      * 
      */
    };
    return config;
  },
  error => {
    message.error('request error!!!');
    console.log('request error', error);
  });

axios.interceptors.response.use(
  response => {
    // token 已过期，重定向到登录页面
    if(response.data && response.data.code){
      if(parseInt(response.data.code) ===108 || parseInt(response.data.code )===109 || response.data.msg ==='TOKEN失效，请重新登录' || response.data.msg ==='TOKEN不存在'){
        history.push("/login");
      }
    }
    const res = response.data;
    //这里根据后台返回来设置
    if (res.msg === "success"|| res.code === '200' || res.code === 200) {
      return response.data ||res.data;
    }
  },
  err => {
    if (err.response) {
      switch (err.response.status){
        case 400:
          err.message = '请求错误'
          break
        case 401:
          // 返回 401 清除token信息并跳转到登录页面
          if(cancelFlag) 
            return Promise.reject(err);
          cancelFlag = true;
          err.message = 'TOKEN已失效'
          localStorage.clear() 
          const history = createHistory();
          setTimeout(() => {
              history.push('/login')
              setTimeout(() => {
                  cancelFlag = false;
              },1000)
          },1500)
          break
        case 403:
          err.message = '未授权,拒绝访问'
          break
        case 404:
          err.message = `请求地址出错: ${err.response.config.url}`
          break
        case 408:
          err.message = '请求超时'
          break
        case 500:
          err.message = '服务器内部错误'
          break
        case 501:
          err.message = '服务未实现'
          break
        case 502:
          err.message = '网关错误'
          break
        case 503:
          err.message = '服务不可用'
          break
        case 504:
          err.message = '网关超时'
          break
        case 505:
          err.message = 'HTTP版本不受支持'
          break
        default:
          err.message = '服务异常,请稍后重试！！'
        }     
      return Promise.reject(err.response) // 返回接口返回的错误信息
  }
})


